﻿using UnityEngine;
using Unity.Profiling;
using System;
using System.Collections;

namespace Obi{

    /**
	 * Small helper class that lets you specify Obi-only properties for rigidbodies.
	 */

    [ExecuteInEditMode]
    public abstract class ObiRigidbodyBase : MonoBehaviour
    {

        public bool kinematicForParticles = false;

        protected ObiRigidbodyHandle rigidbodyHandle;
        public ObiRigidbodyHandle Handle
        {
            get
            {
                // don't check rigidbodyHandle.isValid:
                // CreateRigidbody may defer creation, so we get a non-null, but invalid handle.
                // If calling handle again right away before it becomes valid, it will call CreateRigidbody() again and create a second handle to the same body.
                if (rigidbodyHandle == null) 
                {
                    var world = ObiColliderWorld.GetInstance();

                    // create the material:
                    rigidbodyHandle = world.CreateRigidbody();
                    rigidbodyHandle.owner = this;
                }
                return rigidbodyHandle;
            }
        }

        protected virtual void OnEnable()
        {
            rigidbodyHandle = ObiColliderWorld.GetInstance().CreateRigidbody();
            rigidbodyHandle.owner = this;
        }

		public void OnDisable()
        {
            ObiColliderWorld.GetInstance().DestroyRigidbody(rigidbodyHandle);
        }

		public abstract void UpdateIfNeeded(float stepTime);

		/**
		 * Reads velocities back from the solver.
		 */
		public abstract void UpdateVelocities(Vector3 linearDelta, Vector3 angularDelta);

	}
}

